package com.smart.lib.service;

import com.smart.lib.entity.BookInfo;
import com.smart.lib.mapper.BookMapper;
import com.smart.lib.util.Pager;
import com.smart.lib.util.PagerData;
import com.smart.lib.util.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 图书管理实现类
 * */
@Service
public class BookService {

    @Autowired
    BookMapper bookMapper;

    /**
     * 添加图书
     * */
    public Response addBook(BookInfo bookInfo){
        Integer counts = bookMapper.addBook(bookInfo);
        if(counts>0){
            return new Response(200,"图书添加成功",null);
        }else{
            return new Response(401,"图书添加失败",null);
        }
    }

    /**
     * 编辑图书信息
     * */
    public Response editBook(BookInfo bookInfo){
        Integer counts = bookMapper.editBook(bookInfo);
        if(counts>0){
            return new Response(200,"编辑成功",null);
        }else{
            return new Response(401,"编辑失败",null);
        }
    }

    /**
     * 图书分页+搜索
     * */
    private List<BookInfo> getBookInfoPagerBySearch(Pager pager){
        Integer currentPage = pager.getCurrentPage();
        Integer startIndex = (currentPage - 1)*pager.getPageSize();
        pager.setStartIndex(startIndex);
        return bookMapper.getBookInfoPagerBySearch(pager);
    }

    /**
     * 图书分页总数+搜索
     * 用于计算分页
     * */
    private Integer getBookInfoPagerTotalBySearch(Pager pager){
        return bookMapper.getBookInfoPagerTotalBySearch(pager);
    }

    /**
     * 手动计算分页
     * */
    private Integer getBookPageTotalBySearch(Pager pager){
        Integer bookTotalCounts = getBookInfoPagerTotalBySearch(pager);
        Integer pageTotal = 1 ;//初始设定当前只有一页
        //数据总条数除以pageSize每页显示条数，如取余数求模，如果有余数，页码+1
        //如果可以整除，则页码等于数据总数除以pageSize
        pageTotal = bookTotalCounts/pager.getPageSize();
        if(bookTotalCounts%pager.getPageSize()>0){
            pageTotal += 1;
        }
        return pageTotal;
    }

    /**
     * 根据查询得到分页数据和页面传给前端使用进行数据渲染
     * */
    public Response getBookPagerDataBySearch(Pager pager){
        PagerData pagerData = new PagerData();
        pagerData.setData(getBookInfoPagerBySearch(pager));
        pagerData.setPageTotal(getBookPageTotalBySearch(pager));
        pagerData.setTotal(getBookInfoPagerTotalBySearch(pager));
        return new Response(200,"查询图书信息成功",pagerData);
    }

    /**
     * 图书借阅中通过ISBN码查询图书信息用于借阅和归还
     * */
    public Response getBookInfoByISBN(BookInfo bookInfo){
        //判断用户操作是借阅还是归还
        if(bookInfo.getOperation().equals("borrow")){
            //借阅操作，验证用户是否已借阅过该书籍，不能重复借阅
            Integer isBorrow = bookMapper.validateBookBorrowStatus(bookInfo);
            if(isBorrow>0){
                //不能重复借阅
                return new Response(230,"用户已借阅过，请换一本书",null);
            }
        }else{
            //归还操作，验证用户是否已借阅过该书籍，只有借阅过才能归还
            Integer isBorrow = bookMapper.validateBookBorrowStatus(bookInfo);
            if(isBorrow==0){
                //未借阅过，不能归还
                return new Response(240,"当前用户未借阅该书籍",null);
            }
        }

        //获取图书信息
        BookInfo book = bookMapper.getBookInfoByISB(bookInfo);
        if(book!=null){
            return new Response(200,"查询成功",book);
        }else{
            return new Response(401,"查询失败",null);
        }
    }

    /**
     * 借阅流程中关联方法
     * 借阅时，判断当前书籍的可借阅数
     * @return 返回可借阅数
     * */
    public Integer getCurrentBookAvailableCopies(BookInfo bookInfo){
        return bookMapper.getCurrentBookAvailableCopies(bookInfo);
    }

    /**
     * 借阅流程关联方法
     * 借阅完成后，修改当前书籍已出借数量
     * @return 返回受影响的行
     * */
    public Integer updateCurrentBookBorrowCopies(BookInfo bookInfo){
        return bookMapper.updateCurrentBookBorrowCopies(bookInfo);
    }

    /**
     * 归还流程关联方法
     * 归还时，更新当前书籍的出借数
     * @return 返回受影响的行
     * */
    public Integer updateCurrentBookReturnCopies(BookInfo bookInfo){
        return bookMapper.updateCurrentBookReturnCopies(bookInfo);
    }

    /**
     * 当前图书总数
     * */
    public Integer getBookTotal(){
        return bookMapper.getBookTotal();
    }
}
